package com.example.taikulaapp;

import android.app.ProgressDialog;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleEventObserver;
import androidx.lifecycle.LifecycleOwner;

import com.example.taikulaapp.db.City;
import com.example.taikulaapp.db.County;
import com.example.taikulaapp.db.Province;
import com.example.taikulaapp.util.HttpUtil;
import com.example.taikulaapp.util.Utility;

import org.litepal.LitePal;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

public class ChooseAreaFragment extends Fragment {
    public static final int LEVEL_PROVINCE = 0;
    public static final int LEVEL_CITY = 1;
    public static final int LEVEL_COUNTY = 2;

    /*
    1. 创建视图
    2. 定义方法, 读取数据
    3. 显示数据
     */

    // 定义控件的接收变量
    private TextView titleText;
    private Button back_btn;
    private ListView listView;
    // 适配器
    private ArrayAdapter<String> adapter;
    private List<String> datalist = new ArrayList<>();//存放当前列表显示的数据
    // 定义全局变量接收省和市数据
    private Province currentProvince; // 当前的省
    private City currenCity; //当前的市
    // 数据库中的数据存放的变量
    private List<Province> provinceList; // 省
    private List<City> cityList; // 市
    private List<County> countyList; // 县
    private int currentLevel; //记录当前访问数据类型,取值对应LEVEL_PROVINCE\LEVEL_CITY\LEVEL_COUNTY

    private ProgressDialog progressDialog; // 进度对话框
    /*
    在onCreateView方法中:
    首先要获取控件实例: 也就是choose_area
    然后初始化一个适配器,用于传递数据给listView
     */
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // 动态加载layout文件
        View view = inflater.inflate(R.layout.choose_area,container,false);
        // 获取控件实例
        titleText = view.findViewById(R.id.title_text);
        back_btn = view.findViewById(R.id.back_btn);
        listView = view.findViewById(R.id.list_view);
        // listView 无法直接加载数据,需要定义适配器进行数据的传递
        adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1,datalist);
        listView.setAdapter(adapter);

        return view;
    }
    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        requireActivity().getLifecycle().addObserver(new LifecycleEventObserver() {
            @Override
            public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
                if (event.getTargetState() == Lifecycle.State.CREATED){
                    // 活动视图创建都需要执行的操作
                    queryProvince(); //默认加载省份的数据

                    // listView的点击列表显示对应的附属级数据
                    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                            if (currentLevel == LEVEL_PROVINCE){
                                // 当前显示省级数据 , 点击后显示对应的市级数据
                                currentProvince = provinceList.get(i);
                                queryCity();
                            }
                            else if (currentLevel == LEVEL_CITY){
                                // 当前显示的是市级,就显示对应的县级数据
                                currenCity = cityList.get(i);
                                queryCounty();
                            }
                        }
                    });
                    // 返回按钮的点击事件,返回上级目录
                    back_btn.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            if (currentLevel == LEVEL_COUNTY){
                                queryCity();
                            }
                            else if (currentLevel == LEVEL_CITY){
                                queryProvince();
                            }
                        }
                    });

                    requireActivity().getLifecycle().removeObserver(this);
                }
            }
        });
    }

    // 数据库没有数据的时候,就去请求数据,存放到数据库中,再读取显示
    public void queryFromService(String address,final String type){
        showProgressDialog(); // 进度对话框
        // 传入一个地址参数,一个需要请求的数据的类型
        HttpUtil.sendOKHttpRequest(address, new Callback() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {
                // 响应失败时需要执行的操作
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        closeProgressDialog(); // 关闭进度对话框
                        Toast.makeText(getContext(), "加载失败!", Toast.LENGTH_SHORT).show();
                    }
                });
            }

            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                // 响应成功了需要执行的操作
                String responseText = response.body().string(); // 获取响应的字符串

                // 定义一个返回内容的容器
                boolean result = false;
                // 判断当前服务器响应的数据类型,并调用相应的数据处理方法进行数据解析和存储
                if ("province".equals(type)){
                    result = Utility.handleProvinceResponse(responseText); // 处理数据并存入数据表
                }else if ("city".equals(type)){
                    result = Utility.handleCityResponse(responseText , currentProvince.getProvinceId());
                }else if ("county".equals(type)){
                    result = Utility.handleCountyResponse(responseText , currenCity.getCityId());
                }

                // 数据处理结果
                if (result){
                    // 读取完后切换到主线程去调用方法
                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            closeProgressDialog(); // 关闭进度对话框
                            // 完成了数据处理和存储,则加载数据,并且显示
                            if ("province".equals(type)){
                                queryProvince();
                            } else if ("city".equals(type)) {
                                queryCity();
                            } else if ("county".equals(type)) {
                                queryCounty();
                            }
                        }
                    });

                }
            }
        });
    }

    // 数据库中有数据,不用再次请求,直接读取并且显示
    public void queryProvince(){
        titleText.setText("中国");
        back_btn.setVisibility(View.GONE); //不显示
        // 从数据库中读取数据
        provinceList = LitePal.findAll(Province.class);
        // 判断数据库中的内容是否是空
        if (provinceList.size() > 0){
            // 非空
            datalist.clear();
            for (Province province : provinceList){
                datalist.add(province.getProvinceName());
            }
            // 页面的显示更新
            adapter.notifyDataSetChanged();
            listView.setSelection(0); //初始化,默认选择列表中的第一个省

            // 更新当前访问的状态是:访问的省级的状态
            currentLevel = LEVEL_PROVINCE;
        }else{
            // 空
            String address = "http://guolin.tech/api/china";
            String type = "province";
            queryFromService(address , type);
        }
    }
    public void queryCity(){
        titleText.setText(currentProvince.getProvinceName());
        back_btn.setVisibility(View.VISIBLE);
        // 从city表中找数据
        // ↓返回的是按照条件查找的市
        cityList = LitePal.where("ProvinceId = ?" , String.valueOf(currentProvince.getProvinceId())).find(City.class);
        // cityList = LitePal.findAll(City.class); ←返回的是所有的市
        if (cityList.size() > 0){
            // 数据表非空 则获取数据,进行显示
            datalist.clear(); // 清除之前可能存在的内容
            for (City city : cityList){
                // 添加市的名字到dataList中
                datalist.add(city.getCityName());
            }
            // 数据显示,更新数据
            adapter.notifyDataSetChanged();
            listView.setSelection(0); // 默认选择第一项 初始化 第一个市名
            // 更新当前的访问状态 市级访问状态
            currentLevel = LEVEL_CITY;

        }else{
            // 数据表是空 则请求数据
            int provinceId = currentProvince.getProvinceId();
            String address = "http://guolin.tech/api/china/" + provinceId;
            String type = "city";
            queryFromService(address , type);
        }

    }
    public void queryCounty(){
        titleText.setText(currenCity.getCityName());
        back_btn.setVisibility(View.VISIBLE);
        // 返回目标县
        countyList = LitePal.where("CityId = ?" , String.valueOf(currenCity.getCityId())).find(County.class);
        // countyList = LitePal.findAll(County.class); ←返回的是所有的县
        if (countyList.size() > 0){
            datalist.clear();
            for (County county : countyList){
                datalist.add(county.getCountyName());
            }

            adapter.notifyDataSetChanged();
            listView.setSelection(0);

            currentLevel = LEVEL_COUNTY;
        }else{
            int provinceId = currentProvince.getProvinceId();
            int cityId = currenCity.getCityId();
            String address = "http://guolin.tech/api/china/" + provinceId + "/" + cityId;
            String type = "county";
            queryFromService(address , type);
        }
    }

    private void showProgressDialog(){
        if (progressDialog == null){
            progressDialog = new ProgressDialog(getActivity());
            progressDialog.setMessage("正在加载中...");
            progressDialog.setCanceledOnTouchOutside(false);// 用户点击对话框以外,对话框不消失
        }
        progressDialog.show();
    }
    // 加载成功或加载失败后关闭进度对话框
    private void closeProgressDialog(){
        // 关闭对话框
        if (progressDialog != null){
            progressDialog.dismiss();
        }
    }
}
